import fs from 'node:fs';
import path from 'node:path';

// 步骤0，设置文件夹。指定目录路径，我也不知道为什么，从windows系统复制下来的路径，一个/必须改为两个/。其它系统没试过
// 连上smb服务在线修改文件名：如果是smb服务器（也许是群晖smb服务），那么路径前面的//就要写4个/。
const directoryPathArr = [
  String.raw`Z:\_待处理\生产\万古仙穹 (2017)\Season 01`,
  String.raw`Z:\_待处理\生产\万古仙穹 (2017)\Season 02`,
  String.raw`Z:\_待处理\生产\万古仙穹 (2017)\Season 03`,
  String.raw`Z:\_待处理\生产\万古仙穹 (2017)\Season 04`,
];
// 定制文件格式。默认不用改。如果想把文件格式改成mov，就填上'mov'
const type = '';

// 步骤1，加在前面和后面的，如果没有就默认不填。如果有一个就填{s:'前面',e:'后面'}，如果有多个，就填[{s:'前面',e:'后面'},{s:'前面',e:'后面'}]
// 如本身文件名为e.mp4,此处设置为{s:'前面',e:'后面'}就变成 前面e后面.mp4
// 本身文件名为e.mp4, 如果设置为  [{s:'12',e:'34'},{s:'56',e:'78'}]，就变为 1256e3478.mp4
// const step1 = {s:'E'}
const step1 = '';

//  步骤2，替换、删除，s支持正则表达式，其它跟步骤1一样，也是可以{s:'前面',e:'后面'}和[{s:'前面',e:'后面'},{s:'前面',e:'后面'}]
//  替换：如本身文件名为e.mp4，写  {s:'e',e:'123'}  ，就变成123.mp4
//  删除：如本身文件名为e1e2.mp4，写  {s:'e',e:''}，就变成1e2.mp4
//  更高级功能，参数s可使用正则匹配，如{ s:/e/g,e:'' },就把文件名中所有的e给删了，
// 正则教程https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_expressions
// {s:'-自建',e:''}
// [{s: /S(\d+)/,e: 'Season $1'}]

// const step2 = [{ s:/-|\s|_|\._|、|【|】/g,e:'' },{s:/(19\d\d)([\u4e00-\u9fa5]+)/,e:'$2($1)'}]
//const step2 = [{ s:'西游记第',e:'' },{ s:'-国语720P.qsv.flv',e:''}]
// const step2 = [{ s:/<|，|，|，|，|，|，|，|，|，|，|>|:|"|\/|\\|\||\?|\*/g,e:'' }]
// const step2 = '';
//const step2 = [{ s:'）-TX(蓝光-卡顿等半小时重试)',e:'' },{ s:'[视趣]理科生坠入情网故尝试证明-第',e:''},{ s:'(RR(蓝光-失败点重试))',e:''},{ s:'集 ',e:'' },{ s:'（',e:'-cd' }]
// const step2 = [{s:'[OPFansMaplesnow][one_piece][',e:'E'},{s:'集-BF(超清-高峰卡顿)',e:''},{s:'[追剧兔]海贼王-第',e:'E'},{s:'第',e:'E'}]

//const step2 = [{s:'[视趣]',e:''},{s:'-HD(BF(超清-高峰卡顿))',e:''},{s:'-4k(4K原画(失败卡顿为设备不支持))',e:''},{s:'(BF(超清-高峰卡顿))',e:''},{s:'-HD国语版',e:''},{s:'-HD国语',e:''},{s:'-HD',e:''}];

const step2 = { s: /第/g, e: 'E' };

// 步骤3，做法跟步骤1一样，只不过放在了步骤3来做。
const step3 = ''; //{s:'E'}

// 步骤3附加：整体加还是减，只能填数字或负数，默认是0
// 假如填了-100，那么原本的集数假如是101-201，就变成1-101。此步骤要求在前面几个步骤过程中，必须给文件集数前设好了E，否则不生效
const step3X1 = 0;

// 步骤4，必填，指定E后面的位数，默认为3，即第1集就是E001。此步骤要求在前面几个步骤过程中，必须给文件集数前设好了E，否则不生效
const step4 = 3;

// 步骤6，是否去除某内容前面、后面的内容，或断言
// 这是高级用法，不会的别乱设置
// 默认为''，设置成这样 {s:'',e:''}或{s:''}或 {e:''}
// 假如某文件名为 abc123.mp4,设置为  {s:'c1',e:'c1'},就变成c1.mp4，
// 设置为{s:'c1'},就变成c123.mp4,设置为{e:'c1'},就变成才abc1.mp4
// 内部的s比e优先级更高，可以用正则
// 高级用法(正则)：通过以上步骤把一个文件名变为E0123-XXXX时，在这里面写{e:/E\d+/}，结果就是E0123，（此处不包括文件类型）
// 断言用法：例如直接设置成/E\d+/，那么有一个文件名为XXXE123-XXX.mp4，就会变成E123.mp4
// /E\d+/
//const step5 = ''
const step5 = /E\d+/;

// 只改上面的参数，下面的不能改了

// Array.from(document.querySelectorAll('body ul li a')).map(a=>a.href).join(' ')

const isTo = (a, b) => {
  return a ? a : b ? b : '';
};

directoryPathArr.forEach(dpx => {
  fs.readdir(dpx, (err, files) => {
    if (err) {
      console.log('错误的文件夹内容:', err);
      return;
    }

    const renameArr = [];

    files.forEach(file => {
      const oldFilePath = path.join(dpx, file);

      const nfArr = file.split('.');

      const model = isTo(type, nfArr.length > 1 ? nfArr[nfArr.length - 1] : '');

      let newFileName = nfArr.slice(0, model ? nfArr.length - 1 : 1).join('.');

      if (step1) {
        if (step1.length) {
          step1.forEach(item => {
            newFileName = [isTo(item.s), newFileName, isTo(item.e)].join('');
          });
        } else {
          newFileName = isTo(step1.s) + newFileName + isTo(step1.e);
        }
      }

      if (step2) {
        if (step2.length) {
          step2.forEach(item => {
            newFileName = newFileName.replace(item.s, item.e ?? '');
          });
        } else {
          newFileName = newFileName.replace(step2.s, step2.e ?? '');
        }
      }

      if (step3) {
        if (step3.length) {
          step3.forEach(item => {
            newFileName = [isTo(item.s), newFileName, isTo(item.e)].join('');
          });
        } else {
          newFileName = isTo(step3.s) + newFileName + isTo(step3.e);
        }
      }

      let matchArr = newFileName.match(/(?<=E)\d+/);
      if (!!step3X1 && matchArr) {
        let mca = matchArr[0];
        while (mca[0] === '0') {
          mca = mca.substring(1);
        }
        const num = JSON.parse(mca);
        newFileName = newFileName.replace('E' + matchArr[0], 'E' + (num + step3X1));
      }

      matchArr = newFileName.match(/(?<=E)\d+/);
      if (matchArr && step4) {
        let a0 = matchArr[0];
        if (a0.length < step4) {
          const len = step4 - a0.length;
          let i;
          for (i = 0; i < len; i++) {
            a0 = '0' + a0;
          }
        } else if (a0.length > step4) {
          const len = a0.length - step4;
          let i;
          for (i = 0; i < len; i++) {
            a0 = a0.substring(1);
          }
        }
        newFileName = newFileName.replace('E' + matchArr[0], 'E' + a0);
      }

      const nemc = newFileName.match(step5);
      if (step5 && nemc) {
        const st = nemc[0];
        if (step5 instanceof RegExp || typeof step5 === 'string') {
          newFileName = st;
        }
        if (typeof step5 === 'object' && step5.s) {
          const index = newFileName.indexOf(st);
          newFileName = newFileName.substring(index);
        }
        if (typeof step5 === 'object' && step5.e) {
          const index = newFileName.lastIndexOf(st);
          newFileName = newFileName.substring(0, index + st.length);
        }
      }

      newFileName += model ? '.' + model : '';

      const newFilePath = path.join(dpx, newFileName);
      renameArr.push({ oldFilePath, newFilePath });
    });

    if (!!step3X1) {
      const len = renameArr.length;
      let i = 0;
      const t1 = setInterval(() => {
        if (len === 0) {
          clearInterval(t1);
        }
        const onx = step3X1 > 0 ? renameArr.pop() : renameArr.shift();
        fs.rename(onx.oldFilePath, onx.newFilePath, error => {
          if (error) {
            console.log(`改名失败 ${onx.oldFilePath}:`, error);
          } else {
            console.log(`改名成功：从 ${onx.oldFilePath} 改为 ${onx.newFilePath}`);
          }
        });
        i++;
        if (i >= len) {
          clearInterval(t1);
        }
      }, 200);
    } else {
      while (renameArr.length > 0) {
        const onx = renameArr.shift();
        fs.rename(onx.oldFilePath, onx.newFilePath, error => {
          if (error) {
            console.log(`改名失败 ${onx.oldFilePath}:`, error);
          } else {
            console.log(`改名成功：从 ${onx.oldFilePath} 改为 ${onx.newFilePath}`);
          }
        });
      }
    }
  });
});
